// @flow 

function sum (a:Number, b:number) {
  return a + b
}

sun(100, '100')

// 笔记部分
//强、弱类型 强类型不允许隐式类型转换，弱类型允许
// Flow 静态类型的检查器  //@flow在使用之前先书写这个命令
// javascript:validate.enable 处理es6格式校验


// flow 命令使用
// npm add flow --dev
// flow init
// flow index.js

// 移除模块命令
// npm add flow-remove-type --dev

//vscode 插件 flow-language

// 总结
// flow 语法的目的有点类似于java在声明变量的时候指定 变量的类型，强制限制了类型让函数可读性更强，也更易于理解，有利于写出更高效更优雅的代码

//  原始类型的声明
const a: string = 'a'
const b: number = 1 // infinity , NaN
const c: boolean = true
const d: null = null
const e: void = undefined // 这个要特殊注意
const f: symbol = Symbol

// 数组类型
const arr1 : Array<number> = [1, 2, 3]
const arr2: number[] = [1, 2, 3]

// 元组 固定长度的数组
const arr3 = Array[Number, string] = [1, '2']

// 对象类型
const obj: {foo: String, bar: number} = {foo: '1', bar: 12}
// 对象属性可有可无 - 在属性后面加问号
const obj2: {foo?: string, boo: number} = {boo:1}
// 对象不定类型
const obj3: { [strging]: strging} = {} //任意类型但是值都是字符串

// 函数类型
// 函数类型就是对 传入参数和返回值进行限制

// 特殊类型
// 1.字面量 - 显示变量为某一个值 const a: 'foo' = 'foo'
// const type = 'success' | 'warning' | 'danger'
// const type = strging | number = 1 // '1'  -> const b : StringOrNumber = 1 // '1'

// maybe 类型 - 可以接受所有类型的参数 - 弱类型
// function pass(value: mixed)
// any 类型 - 可以接受所有类型的参数 - 强类型
// function pass (value: any)